package code_generator

import "go/token"

type PackageInfo struct {
	FileSet    *token.FileSet
	Dir        string
	Name       string
	ConstTypes map[string]string
	FileMap    map[string]*FileInfo
	Files      []*FileInfo
}

func (i *PackageInfo) File(pos token.Pos) *FileInfo {
	fileName := i.FileSet.File(pos).Name()
	file, exists := i.FileMap[fileName]
	if !exists {
		file = &FileInfo{
			Package:    i.Name,
			FilePath:   fileName,
			ConstTypes: i.ConstTypes,
			Structs:    make(map[string]*StructInfo),
		}
		i.FileMap[fileName] = file
		i.Files = append(i.Files, file)
	}
	return file
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
type FileInfo struct {
	Package    string
	FilePath   string
	ConstTypes map[string]string
	Structs    map[string]*StructInfo
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
type StructInfo struct {
	Package string
	Name    string
	Fields  []*FieldInfo
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
type FieldInfo struct {
	Name     string
	Type     *TypeInfo
	IsFixLen bool
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
type TypeInfo struct {
	Name      string
	DefName   string
	Size      int
	Len       string
	Type      *TypeInfo
	IsUnknown bool
	IsPoint   bool
	IsArray   bool
	IsMap     bool
}
